/*!
 * \file WtHftStraFact.cpp
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief WonderTrader HFT高频策略工厂实现文件
 * 
 * \details 该文件实现了WtHftStraFact类的完整功能，提供HFT高频策略的工厂管理服务：
 *          
 *          核心功能实现：
 *          - C接口导出：支持动态库加载和插件化使用
 *          - 策略创建：根据策略名称创建具体高频策略实例
 *          - 策略销毁：安全释放策略实例和相关资源
 *          - 策略枚举：列出工厂支持的所有高频策略类型
 *          - 工厂标识：提供唯一的工厂名称
 *          
 *          支持的策略：
 *          - SimpleHft：简单高频策略，适合初学者学习
 *          - 其他自定义HFT策略（可扩展）
 *          
 *          高频交易特性：
 *          - 毫秒级响应：策略实例化和管理优化
 *          - 内存管理：高效的对象创建和销毁
 *          - 插件化架构：支持动态加载和卸载
 *          - 异常安全：完善的错误处理和资源管理
 *          
 *          作为高频交易系统的重要组件，支持策略的动态加载和管理
 */

#include "WtHftStraFact.h"
#include "WtHftStraDemo.h"

#include <string.h>

const char* FACT_NAME = "WtHftStraFact";	/*!< 工厂名称常量 */

/*!
 * \brief C接口导出函数
 * 
 * \details 提供标准C接口，便于动态库加载和插件化使用
 */
extern "C"
{
	/*!
	 * \brief 创建高频策略工厂实例
	 * \return IHftStrategyFact接口指针
	 * 
	 * \details 创建HFT高频策略工厂的新实例，用于策略管理：
	 *          - 返回基类接口指针，便于多态使用
	 *          - 调用者负责通过deleteStrategyFact释放资源
	 *          - 支持高频交易的特殊优化
	 */
	EXPORT_FLAG IHftStrategyFact* createStrategyFact()
	{
		IHftStrategyFact* fact = new WtHftStraFact();
		return fact;
	}

	/*!
	 * \brief 删除高频策略工厂实例
	 * \param fact 要删除的工厂实例指针
	 * 
	 * \details 安全删除高频策略工厂实例并释放相关资源：
	 *          - 检查指针有效性，防止空指针删除
	 *          - 清理工厂管理的所有高频策略资源
	 *          - 确保内存和网络连接正确释放
	 */
	EXPORT_FLAG void deleteStrategyFact(IHftStrategyFact* fact)
	{
		if (fact != NULL)
			delete fact;
	}
}

/*!
 * \brief 构造函数
 * 
 * \details 初始化高频策略工厂，设置默认状态
 */
WtHftStraFact::WtHftStraFact()
{
}

/*!
 * \brief 析构函数
 * 
 * \details 清理工厂资源，确保所有高频策略实例被正确释放
 */
WtHftStraFact::~WtHftStraFact()
{
}

/*!
 * \brief 获取工厂名称
 * \return 工厂名称字符串
 * 
 * \details 返回该工厂的唯一标识名称，用于：
 *          - 区分不同的高频策略工厂
 *          - 策略实例的归属验证
 *          - 日志记录和错误诊断
 */
const char* WtHftStraFact::getName()
{
	return FACT_NAME;
}

/*!
 * \brief 枚举工厂支持的高频策略
 * \param cb 枚举回调函数
 * 
 * \details 通过回调函数列出工厂支持的所有高频策略类型：
 *          - "SimpleHft"：简单高频策略，展示基本HFT框架
 *          
 *          回调参数说明：
 *          - 参数1：工厂名称
 *          - 参数2：策略名称
 *          - 参数3：是否为扩展策略（true表示高级功能）
 *          
 *          扩展策略特点：
 *          - 更复杂的算法逻辑
 *          - 更高的性能要求
 *          - 需要更多的资源和权限
 */
void WtHftStraFact::enumStrategy(FuncEnumHftStrategyCallback cb)
{
	cb(FACT_NAME, "SimpleHft", true);
}

/*!
 * \brief 创建高频策略实例
 * \param name 策略名称
 * \param id 策略实例ID
 * \return 创建的策略实例指针，失败返回NULL
 * 
 * \details 根据策略名称创建对应的高频策略实例：
 *          - "SimpleHft"：创建高频示例策略实例
 *          - 不支持的策略名称返回NULL
 *          - 每个策略实例具有唯一的ID标识
 *          - 调用者负责通过deleteStrategy释放策略实例
 *          
 *          高频策略特殊考虑：
 *          - 内存对齐和缓存友好
 *          - 减少不必要的初始化开销
 *          - 支持热插拔和动态重配置
 */
HftStrategy* WtHftStraFact::createStrategy(const char* name, const char* id)
{
	if(strcmp(name, "SimpleHft") == 0)
	{
		return new WtHftStraDemo(id);
	}

	return NULL;
}

/*!
 * \brief 删除高频策略实例
 * \param stra 要删除的策略实例指针
 * \return 删除成功返回true，失败返回false
 * 
 * \details 安全删除高频策略实例并释放相关资源：
 *          - 检查策略指针有效性
 *          - 验证策略是否属于本工厂创建
 *          - 停止所有订单和交易活动
 *          - 清理网络连接和数据订阅
 *          - 执行安全删除操作
 *          - 防止删除其他工厂创建的策略实例
 *          
 *          高频策略特殊处理：
 *          - 确保所有未完成订单被正确处理
 *          - 释放高频数据流订阅
 *          - 清理实时计算缓存
 */
bool WtHftStraFact::deleteStrategy(HftStrategy* stra)
{
	if (stra == NULL)
		return true;

	if (strcmp(stra->getFactName(), FACT_NAME) != 0)
		return false;

	delete stra;
	return true;
}
